package rath.toys.springnote;

import java.io.*;
import java.util.List;
import java.util.Random;
/**
 *  
 * @author Jang-Ho Hwang, rath@ncsoft.net
 * @version 1.0
 */
public class TestActions
{
	private final SpringNote note;

	public TestActions( SpringNote note )
	{
		this.note = note;
	}

	/**
	 * 페이지 CRUD 를 테스트한다.
	 */
	public void doTest() throws Exception
	{
		String title = "__Test-API__";
		String content = "<p>내용없음</p>";

		System.out.println( "* 페이지 목록 가져오는 중.." );
		List<PageMeta> metas = note.getPages();
		for(PageMeta m : metas)
		{
			if( m.getName().equals(title) )
			{
				System.out.println( "  테스트를 위해 " + title + " 페이지 삭제" );
				note.removePage(m.getId());
			}
		}
		System.out.println( "* 페이지 목록 가져오기 성공" );
		System.out.println();

		System.out.println( "* 페이지 생성 중.." );
		Page page = note.addPage(title, content);
		if( page==null )
			throw new RuntimeException("페이지를 생성하지 못했습니다. (created page is null)");
		printPage(page);
		System.out.println( "* 페이지 생성 성공" );
		System.out.println();

		System.out.println( "* 페이지 수정 중.." );
		note.updatePage( page.getId(), "XXX 내용을 변경함 XXX" );
		printPage(page);
		System.out.println( "* 페이지 변경됨" );
		System.out.println();

		System.out.println( "* 페이지 검색 중.." );
		metas = note.searchPages(title, false);
		boolean isPass = false;
		for(PageMeta m : metas)
			if( m.getId()==page.getId() )
				isPass = true;
		if( !isPass )
			System.out.println( "ERROR 페이지 제목으로 검색 실패" );
		else
			System.out.println( "* 페이지 제목으로 검색 성공" );

		metas = note.searchPages("XXX 내용을 변경함 XXX", true);
		isPass = false;
		for(PageMeta m : metas)
			if( m.getId()==page.getId() )
				isPass = true;
		if( !isPass )
			System.out.println( "ERROR 페이지 내용으로 검색 실패" );
		else
			System.out.println( "* 페이지 내용으로 검색 성공" );
		System.out.println();

		// 첨부파일 
		
		System.out.println( "* 첨부파일 3개를 만듭니다..." );

		File f1 = new File("test-upload1.dat");
		File f2 = new File("test-upload2.dat");
		File f3 = new File("test-upload3.dat");

		byte[] buf = new byte[1024*200];	
		Random rng = new Random();

		FileOutputStream fos = null;

		fos = new FileOutputStream(f1);
		rng.nextBytes( buf );
		fos.write(buf);
		fos.flush();
		fos.close();

		fos = new FileOutputStream(f2);
		rng.nextBytes( buf );
		fos.write(buf);
		fos.flush();
		fos.close();
		
		fos = new FileOutputStream(f3);
		rng.nextBytes( buf );
		fos.write(buf);
		fos.flush();
		fos.close();
		System.out.println( "* 첨부파일 3개 생성 성공" );
		System.out.println();


		System.out.println( "* 첨부파일 업로드 시작.." );
		System.out.println( "   파일 1번 업로드.." );
		note.addAttachment(new Attachment(page.getId()), f1);
		System.out.println( "   파일 2번 업로드.." );
		note.addAttachment(new Attachment(page.getId()), f2);
		System.out.println( "   파일 3번 업로드.." );
		note.addAttachment(new Attachment(page.getId()), f3);
		System.out.println( "* 첨부파일 업로드 성공" );
		System.out.println();

		f1.delete(); 
		f2.delete();
		f3.delete();

		System.out.println( "* 첨부파일 목록 가져오기.." );
		for(Attachment a : note.getAttachments(page.getId()))
		{
			System.out.println( "   파일 " + a.getTitle() + ", id=" + a.getId() );
		}
		System.out.println( "* 첨부파일 목록 가져오기 성공" );
		System.out.println();


		f1 = new File("test-download1.dat");
		f2 = new File("test-download2.dat");
		f3 = new File("test-download3.dat");

		System.out.println( "* 첨부파일 다운로드.." );
		List<Attachment> files = note.getAttachments(page.getId());
		System.out.println( "   파일 " + files.get(0).getTitle() + 
			", id=" + files.get(0).getId() + " 다운로드" );
		note.downloadAttachment( files.get(0), f1 );
		System.out.println( "   파일 " + files.get(1).getTitle() + 
			", id=" + files.get(1).getId() + " 다운로드" );
		note.downloadAttachment( files.get(1), f2 );
		System.out.println( "   파일 " + files.get(2).getTitle() + 
			", id=" + files.get(2).getId() + " 다운로드" );
		note.downloadAttachment( files.get(2), f3 );
		System.out.println( "* 첨부파일 다운로드 성공" );
		System.out.println();

		f1.delete(); 
		f2.delete();
		f3.delete();

		System.out.println( "* 첨부파일 모두 삭제.." );
		for(Attachment a : note.getAttachments(page.getId()))
		{
			System.out.println( "   파일 " + a.getTitle() + ", id=" + a.getId() + " 삭제함." );
			note.removeAttachment(a);
		}
		System.out.println( "* 첨부파일 모두 삭제 성공" );
		System.out.println();

		System.out.println( "* 페이지 삭제 중.." );
		note.removePage(page.getId());
		System.out.println( "* 페이지 삭제 성공" );
	}

	protected void printPage( Page page )
	{
		System.out.println( "  페이지 ID  : " + page.getId() );
		System.out.println( "  페이지 이름: " + page.getName() );
		System.out.println( "  생성된 날짜: " + page.getCreationDate() );
		System.out.println( "  최종 수정자: " + page.getLastContributor() );
		System.out.println( "  수정된 날짜: " + page.getLastModifiedDate() );
	}
}
